Los modelos encapsulan la información referente al dominio de la aplicación web. Compuestos por campos generalmente cada modelo mapea a una única tabla de la base de datos.
Cada modelo es una clase en Python que hereda de django.db.models.Model.
Cada atributo del modelo se corresponde con una columna en la base de datos.
Con esto Django genera automáticamente una API de acceso a datos.
Django tiene 4 backends oficiales MySQL, SQLite, Postgres y Oracle.
Existen otros backends creados por la comunidad para Firebird, ODBC, SQL Server y bases de datos no relacionales.
1 class Persona(models.Model):
2 nombre = models.CharField(max_length=50)
3
4
5 class Mascota(models.Model):
6 # Constantes
7 MACHO, HEMBRA = 'm', 'h'
8 SEXO_CHOICES = (
9 (MACHO, 'Macho'), (HEMBRA, 'Hembra')
10 )
11 duenio = models.ForeignKey(Persona, null=True, blank=True)
12 raza = models.ForeignKey('Especie') # Relación hacia adelante
13 sexo = models.CharField(max_length=1, choices=SEXO_CHOICES)
14
15 class Especie(models.Model):
16 nombre = models.CharField(max_length=50)
17 domesticable = models.BooleanField(default=True)
18
19 class Raza(models.Model):
20 nombre = models.CharField(max_length=50)
21 especie = models.ForeignKey(Especie)
1 python manage.py validate
2
3 0 errors found
1 python manage.py syncdb
2
3 Creating table common_persona
4 Creating table common_mascota
5 Creating table common_especie
6 Creating table common_raza
1 BEGIN;
2 CREATE TABLE "common_persona" (
3 "id" integer NOT NULL PRIMARY KEY,
4 "nombre" varchar(50) NOT NULL
5 );
6 CREATE TABLE "common_mascota" (
7 "id" integer NOT NULL PRIMARY KEY,
8 "duenio_id" integer REFERENCES "common_persona" ("id"),
9 "raza_id" integer NOT NULL,
10 "sexo" varchar(1) NOT NULL
11 );
12 CREATE TABLE "common_especie" (
13 "id" integer NOT NULL PRIMARY KEY,
14 "nombre" varchar(50) NOT NULL,
15 "domesticable" bool NOT NULL
16 );
17 CREATE TABLE "common_raza" (
18 "id" integer NOT NULL PRIMARY KEY,
19 "nombre" varchar(50) NOT NULL
20 );
21 COMMIT;
Y esto sin contar los índices!
Los modelos herdean el comportamiento de models.Model, métodos como save y delete ya están disponibles para ser utilizados.
1 from miapp.models import Persona
2
3 p = Persona(nombre='Dundee')
4 p.save()
5
6 p.id
7 # -> 1
8
9 p.save()
10 p.id
11 # -> 1
12
13 q = Persona()
14 q.nombre = 'Anonio'
15 # -> None
16 q.save()
17
18 q.nombre = 'Antonieta'
19 q.save()
20 q.delete()
Al ser clases los modelos pueden tener métodos que efectuen alguna acción en función de los datos que contengan, por ejemplo, la representación como cadena:
1 class Persona(models.Model):
2 nombre = models.CharField(max_length=50)
3 def __unicode__(self):
4 return "Soy %s" % self.nombre
Metainformación Permite agregar información como el nombre de la tabla en la base de datos, una etiqueta de texto, orden por defecto, restricciones de unicidad, etc.
1 class Registro(models.Model):
2 fecha = models.DateField()
3 class Meta:
4 verbose_name = "Registro de actividad"
5 verbose_name_plural = "Registros de actividad"
6 ordering = '-fecha'
Django provee una propiedad en todos los modelos que nos permite hacer SELECT, INSERT, UPDATE y DELETE muy facilmente.
1 Persona.objects.create(nombre='Jose')
2
3 Persona.objects.filter(nombre__istartswith='jos')
4
5 mascotas = Mascota.objects.exclude(sexo=Mascota.MACHO)
6
7 mascotas.filter(raza=Raza).delete()
Los managers devuelven objetos del tipo QuerySet con el SQL calculado pero no evaluado (no se ejecutó sobre la base), cuando se recorre por primera vez, se ejecuta la consulta.
Si bien django provee un buen número de características como
Disponemos de muchos paquetes de 3ros que se instalan con pip y proveen extensiones, comandos, template tags, vistas genericas, etc.
Las aplicaciones de terceros ahorran mucho tiempo.
South es una herramienta de migración de datos, permite gestionar el cambio en nuestros modelos desde un nivel de abstracción alto, minimizando de esta manera el uso de SQL.
Agrega commandos en manage.py para trabajar dichos cambios:
Analiza las diferencias entre models.py y la base de datos y genera un script de migración
Aplica o desaplica migraciones de esquema (estructura)
Convierte aplicaciones que no usen South, en aplicaciones con South
Aplica o desaplica migraciones de datos
2 y 4 son transparentes
Se instala con pip en nuestro ambiente
1 pip install South
Se agrega como una aplicación instalada en setting.py en la lista de INSTALLED_APPS.
1 INSTALLED_APPS = ( 'south', )
Comandos basicos
1 # Convertir a South
2 python manage.py convert_to_south common
3 # Crear una migración
4 python manage.py schemamigration common --auto
5 # Aplicar una migración
6 python manage.py migrate common
7 # Listar
8 python manage.py migrate common --list
9 # Vovler a algún estado de la base de atos
10 python manage.py migrate common 001
Es una coleccion de paneles configurables que presenta mucha informacion de debug referida al request/response en curso.
Instalacion con pip
1 pip install django-debug-toolbar
Modificamos settings.py para agregar la aplicacion, el middleware y algo de seguridad.
1 INSTALLED_APPS = (
2 ...
3 'debug_toolbar',
4 )
5
6 # El orden es imporatante, debe estar despues de los middlewares que apliquen algun encoding sobre el response
7 MIDDLEWARE_CLASSES = (
8 # ...
9 'debug_toolbar.middleware.DebugToolbarMiddleware',
10 # ...
11 )
12
13 # Solo para localhost
14 INTERNAL_IPS = ('127.0.0.1',)
En settings.py
1 DEBUG_TOOLBAR_PANELS = (
2 'debug_toolbar.panels.version.VersionDebugPanel',
3 'debug_toolbar.panels.timer.TimerDebugPanel',
4 'debug_toolbar.panels.settings_vars.SettingsVarsDebugPanel',
5 'debug_toolbar.panels.headers.HeaderDebugPanel',
6 'debug_toolbar.panels.request_vars.RequestVarsDebugPanel',
7 'debug_toolbar.panels.template.TemplateDebugPanel',
8 'debug_toolbar.panels.sql.SQLDebugPanel',
9 'debug_toolbar.panels.signals.SignalDebugPanel',
10 'debug_toolbar.panels.logger.LoggingPanel',
11 )
12
13 DEBUG_TOOLBAR_CONFIG = {
14 'INTERCEPT_REDIRECTS': False,
15 'SHOW_TOOLBAR_CALLBACK': lambda request: True,
16 'EXTRA_SIGNALS': ['myproject.signals.MySignal'],
17 'HIDE_DJANGO_SQL': False,
18 'SHOW_TEMPLATE_CONTEXT': True,
19 'TAG': 'div',
20 'ENABLE_STACKTRACES' : True,
21 }
| Table of Contents | t |
|---|---|
| Exposé | ESC |
| Full screen slides | e |
| Presenter View | p |
| Source Files | s |
| Slide Numbers | n |
| Toggle screen blanking | b |
| Show/hide slide context | c |
| Notes | 2 |
| Help | h |